package Controlador;

import Modelo.Chofer;
import Modelo.Listas;
import Modelo.UnidadT;
import Modelo.Validaciones;
import Modelo.Viaje;
import Vista.JFrameViajes;
import Vista.Mensajes;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.LinkedList;

public class ControladorViajes implements ActionListener, KeyListener {

    private JFrameViajes formViajes;
    private Listas LisV;
    private Viaje viaje;

    public ControladorViajes(Listas LisViajes) {
        LisV = LisViajes;
        formViajes = new JFrameViajes();
        formViajes.AgregarListener(this, this);
        formViajes.setVisible(true);
        AsignarCodigoViaje();

        Calendar fecha = Calendar.getInstance();
        SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm aa");
        String formattedDate = dateFormat.format(new Date());
        formViajes.getHoraSalida().setText(formattedDate);
    }

    //********************************************** 
    // Opciones de Botones    
    //***********************************************    
    @Override
    public void actionPerformed(ActionEvent e) {
        //---------------------------
        //Boton generar vehiculo
        //---------------------------
        if (e.getSource().equals(formViajes.getBtnGenerarVehiculo())) {
            GenerarVehiculo();
        }
        //boton Salir
        if (e.getSource().equals(formViajes.getBtnSalirV())) {
            formViajes.dispose();
        }
        if (e.getSource().equals(formViajes.getBtnGuardarV())) {
            GuardarViaje();
        }
        if (e.getSource().equals(formViajes.getBtnEliminarV())) {
            Limpiar();
        }

        if (e.getSource().equals(formViajes.getBtnBuscarV())) {
            new ControladorConsulViajes(LisV);
        }

        if (e.getSource().equals(formViajes.getCmbRutas())) {
            ComboRutas();
        }

        if (e.getSource().equals(formViajes.getCmbCdChofer())) {
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyPressed(KeyEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        //throw new UnsupportedOperationException("Not supported yet.");
    }

//------------------------------
    private void GenerarVehiculo() {
        Limpiar();
        int AleaVehi;
        int TamVehi;
        int TamChoferes;
        UnidadT unidad;
        Chofer chofer = new Chofer();

        LinkedList<Chofer> ListaChoferesCooperativa = new LinkedList<Chofer>();

        TamVehi = LisV.getListaUnidadT().size();
        //TamChoferes = LisV.getListaChoferes().size();

        AleaVehi = Validaciones.Generar_Aleatorio(TamVehi);
        unidad = LisV.getListaUnidadT().get(AleaVehi);
        formViajes.getTxtPlacaVehV().setText(unidad.getPlaca());
        formViajes.getTxtCIChoV().setText(unidad.getCISocio());
        cargarCIChofer();
        formViajes.getTxtCodigoCoopV().setText(unidad.getCodCooperativa());
        
        //----------------------------------------------------------------
        // estos metodos se los agregue, para que mostrara la capacidad de los vehiculos
        // ambos funcionan bien, diganme cual es mejor o si no lo consideran necesario?
        formViajes.getjLabelMax().setText("Max:" + " " + unidad.getCapacidad()); // capacidad en un label
        formViajes.getTxtCantidadPasV().setToolTipText("Max:" + " " + unidad.getCapacidad()); // capacidad en un tooltiptext
        //----------------------------------------------------------------
        formViajes.getCmbRutas().removeAllItems();
        formViajes.getCmbRutas().addItem("Seleccione una Ruta");
        for (int i = 0; i < LisV.getListaRutaCoop().size(); i++) {
            if (LisV.getListaRutaCoop().get(i).getCodigoCp().equals(unidad.getCodCooperativa())) {
                String codRuta = LisV.getListaRutaCoop().get(i).getCodigoR();
                String desRuta = "";
                for (int j = 0; j < LisV.getListaRutas().size(); j++) {
                    if (LisV.getListaRutas().get(j).getCodigoR().equals(codRuta)) {
                        desRuta = "Codigo: " + LisV.getListaRutas().get(j).getCodigoR() + " "
                                + LisV.getListaRutas().get(j).getDestino();
                    }
                }
                formViajes.getCmbRutas().addItem(desRuta);
            }
        }
        formViajes.getCmbRutas().setSelectedIndex(0);
    }

    /* Funciona pero funciona mal! ni idea de porque no funciona correctamente
     * puedes ser por el generar, aunq ya se puede guardar correctamente */
    private void cargarCIChofer() {
        String chof;
        formViajes.getCmbCdChofer().removeAllItems();
        formViajes.getCmbCdChofer().addItem("Seleccione el Chofer");
        for (int j = 0; j <  LisV.getListaChoferes().size(); j++) 
        {
            if(LisV.getListaChoferes().get(j).getCISocio().equals(formViajes.getTxtCIChoV().getText()))
            {
                chof = LisV.getListaChoferes().get(j).getCedula();
                formViajes.getCmbCdChofer().addItem(chof);
                formViajes.getCmbCdChofer().setToolTipText(LisV.getListaChoferes().get(j).getNombres());
            }            
        }        
    }

//----------------------------------------------------------------
    // es necesario que al guardar los viajes, se registre el chofer que manejara 
    // dicha unidad. ya que para los reportes es necesario eso.
    private void GuardarViaje() {
        Viaje viaje = new Viaje();
        String Cadena;

        Cadena = formViajes.getTxtFechaLlegada().getText();
        if (Cadena.length() == 0) {
            Mensajes.Aviso("Fecha de llegada Vacia", "");
            formViajes.getTxtFechaLlegada().requestFocusInWindow();
            return;
        }

        Cadena = formViajes.getCmbCdChofer().getSelectedItem().toString();
        if(Cadena.equals("Seleccione el Chofer"))
        {
            Mensajes.Aviso("Seleccione un Chofer", "");
            formViajes.getCmbCdChofer().requestFocusInWindow();
            return;
        }
        
        Cadena = formViajes.getTxtCantidadPasV().getText();
        if (Cadena.length() == 0) {
            Mensajes.Aviso("Cantidad de pasajeros Vacia", "");
            formViajes.getTxtCantidadPasV().requestFocusInWindow();
            return;
        }
        int capacidad = 0;
        for (int i = 0; i < LisV.getListaUnidadT().size(); i++) {
            if (LisV.getListaUnidadT().get(i).getPlaca().equals(formViajes.getTxtPlacaVehV().getText())) {
                capacidad = LisV.getListaUnidadT().get(i).getCapacidad();
            }
        }
        if (Integer.parseInt(Cadena) > capacidad) {
            Mensajes.Aviso("Cantidad de pasajeros excedida\n" + "Capacidad Máxima: " + capacidad, "");
            formViajes.getTxtCantidadPasV().requestFocusInWindow();
            return;
        }

        Cadena = formViajes.getCmbRutas().getSelectedItem().toString();
        if (Cadena.equals("Seleccione una Ruta")) {
            Mensajes.Aviso("Seleccione una Ruta", "");
            formViajes.getCmbRutas().requestFocusInWindow();
            return;
        }
        String dest = "";
        String[] dato;
        dato = Cadena.split(" ");
        for (int i = 2; i < dato.length; i++) {
            dest = dest + dato[i] + " ";
        }
        viaje.Viaje(formViajes.getCodViaje().getText(),
                formViajes.getTxtPlacaVehV().getText(),
                formViajes.getTxtCIChoV().getText(),
                formViajes.getCmbCdChofer().getSelectedItem().toString(),
                formViajes.getTxtCodigoCoopV().getText(),
                formViajes.getDateFechaSalida().getDate(),
                formViajes.getHoraSalida().getText(),
                dest,
                Validaciones.CnvStringFecha(formViajes.getTxtFechaLlegada().getText()),
                formViajes.getTxtHoraLLegadaV().getText(),
                Integer.parseInt(formViajes.getTxtCantidadPasV().getText()));
        LisV.getListaViajes().add(viaje);
        Mensajes.Aviso("Viaje registrado con exito", "");
        Limpiar();
        AsignarCodigoViaje();
        formViajes.getBtnBuscarV().requestFocusInWindow();

    }

    private void ComboRutas() {
        if (formViajes.getCmbRutas().getSelectedIndex() > -1) {
            int dias, horas, min;
            Date fecha;
            String[] arrCod;
            String codRuta, dura;
            String datoRuta = formViajes.getCmbRutas().getSelectedItem().toString();
            arrCod = datoRuta.split(" ");
            codRuta = arrCod[1];
            if (!datoRuta.equals("Seleccione una Ruta") & !datoRuta.equals("")) {
                for (int i = 0; i < LisV.getListaRutas().size(); i++) {
                    if (LisV.getListaRutas().get(i).getCodigoR().equals(codRuta)) {
                        dura = LisV.getListaRutas().get(i).getDuracion();
                        arrCod = dura.split(" ");
                        dias = Integer.parseInt(arrCod[0]);
                        horas = Integer.parseInt(arrCod[1]);
                        min = Integer.parseInt(arrCod[2]);
                        SumarDuracionFecha(formViajes.getDateFechaSalida().getDate(),
                                formViajes.getHoraSalida().getText(),
                                dias, horas, min);
                    }
                }
            }
        }
    }

    private void SumarDuracionFecha(Date fecha, String hora, int dias, int horas, int min) {

        String[] dato;
        String ampm, tokenHora;
        int d = 0, h = 0, m = 0;
        dato = hora.split(" ");
        ampm = dato[1];
        tokenHora = dato[0];
        dato = tokenHora.split(":");
        h = Integer.parseInt(dato[0]);
        m = Integer.parseInt(dato[1]);
        d = dias;
        if (min + m > 60) {
            m = min + m - 60;
            h = h + 1;
        } else {
            m = min + m;
        }
        if (horas <= 12) {
            if (h + horas > 12 & ampm.equals("PM")) {
                ampm = "AM";
                h = h + horas - 12;
                d = d + 1;
            } else if (h + horas > 12 & ampm.equals("AM")) {
                ampm = "AM";
                h = h + horas - 12;
            } else {
                h = h + horas;
            }
        } else if (horas > 12) {
            if (h + horas > 24 & ampm.equals("PM")) {
                ampm = "AM";
                h = h + horas - 24;
                d = d + 1;
            } else if (h + horas > 24 & ampm.equals("AM")) {
                ampm = "PM";
                h = h + horas - 24;
            } else {
                h = h + horas - 12;
            }

        }

        fecha = Validaciones.sumarFechasDias(formViajes.getDateFechaSalida().getDate(), d);
        DateFormat df = DateFormat.getDateInstance();
        String f = df.format(fecha);
        formViajes.getTxtFechaLlegada().setText(f);
        formViajes.getTxtHoraLLegadaV().setText(h + ":" + m + " " + ampm);
    }

    private void AsignarCodigoViaje() {
        int nroV = LisV.getListaViajes().size() + 1;
        formViajes.getCodViaje().setText("V000" + nroV);
    }

    private void Limpiar() {
        formViajes.getTxtCIChoV().setText("");
        formViajes.getTxtPlacaVehV().setText("");
        formViajes.getTxtCodigoCoopV().setText("");
        formViajes.getTxtCantidadPasV().setText("");
        formViajes.getTxtFechaLlegada().setText("");
        formViajes.getTxtHoraLLegadaV().setText("");
        formViajes.getCmbRutas().setSelectedIndex(-1);
        formViajes.getCmbCdChofer().setSelectedIndex(-1);
        formViajes.getjLabelMax().setText("");
        formViajes.getBtnBuscarV().requestFocusInWindow();
    }
    //-----------------------
   /* private void Enabled(boolean Status) {
     formViajes.getTxtPlaca().setEnabled(!Status);
     formUnidadT.getCmbCapacidad().setEnabled(Status);
     formUnidadT.getCmbBuscarSocios().setEnabled(Status);
     }
     */
}
